package com.starpl.mobile.android.monthunsae.november.activity;

import java.io.UnsupportedEncodingException;
import java.util.Calendar;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.DatePickerDialog;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;

import com.starpl.mobile.android.monthunsae.november.R;
import com.starpl.mobile.android.monthunsae.november.command.MonthUnsaeCommand;
import com.starpl.mobile.android.monthunsae.november.domain.MonthUnsae;
import com.starpl.mobile.android.monthunsae.november.domain.UserInfo;
import com.starpl.mobile.android.platform.common.DateUtil;
import com.starpl.mobile.android.platform.common.base.BaseActivity;
import com.starpl.mobile.android.platform.common.base.BaseApplication;
import com.starpl.mobile.android.platform.common.network.HttpHandler;


/**
 * 운세정보입력을 위한 Activity
 * 
 * @author 우연화
 * @since 2011.03.16
 */
public class JoinExtraActivity extends BaseActivity implements OnClickListener
{
	private final int SUN_ID 	= 0;
	private final int LUNAR_DEFAULT_ID 	= 1;
	private final int LUNAR_LEAP_ID 	= 2;
	
	
	private EditText mEtUserName;
	private EditText mEtUserPhone;
	private ImageButton mIbMan;
	private ImageButton mIbWoman;
	private TextView mTvBirthDay;
	private TextView mTvMonth;
	private ImageButton mIbFinish;
	private TextView mTvInformation;
	
	private String mBirthDay;
	private int mLunarType;
	private int mSexFlag;
	
	/* (non-Javadoc)
	 * @see com.starpl.platform.common.base.BaseActivity#onCreate(android.os.Bundle)
	 */
	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.join_extra_activity);
		
		mEtUserName = (EditText)findViewById(R.id.join_extra_activity_et_user_name);
		mEtUserPhone = (EditText)findViewById(R.id.join_extra_activity_et_phone);
		
		mIbMan = (ImageButton)findViewById(R.id.join_extra_activity_ib_man);
		mIbWoman = (ImageButton)findViewById(R.id.join_extra_activity_ib_woman);
		mIbFinish = (ImageButton)findViewById(R.id.join_extra_activity_ib_finish);
		
		mTvBirthDay = (TextView)findViewById(R.id.join_extra_activity_tv_birthday);
		mTvMonth = (TextView)findViewById(R.id.join_extra_activity_tv_month);
		mTvInformation = (TextView)findViewById(R.id.join_extra_activity_tv_information);
		
		mIbMan.setOnClickListener(this);
		mIbWoman.setOnClickListener(this);
		mIbFinish.setOnClickListener(this);
		mTvBirthDay.setOnClickListener(this);
		mTvMonth.setOnClickListener(this);
		
		mIbMan.setSelected(true);
		mIbWoman.setSelected(false);
		mSexFlag = 1;
		mBirthDay = "1990-01-01";
		mTvMonth.setText("양력");
		
		registerForContextMenu(mTvMonth);
		
		String text = "완료버튼을 클릭하시면 <font color=\"#E44044\"><a href=\"http://partner.starpl.com/partner/sinbiun/main/info/tos\">이용약관</a></font> 및 " +
			"<font color=\"#E44044\"><a href=\"http://partner.starpl.com/partner/sinbiun/main/info/privacy\">개인정보보호정책</a></font>을 읽고 동의하시는 것으로 간주하며, " +
			"starpl.com에 회원가입됩니다." +
			"<br>운세결과에 필요한 정보는 sinbiun.com에 제공됩니다.";
		
		mTvInformation.setMovementMethod(LinkMovementMethod.getInstance());
		mTvInformation.setText(Html.fromHtml(text));
	}
	
	// TODO 전화번호 에딧텍스트에서는, 숫자키보드, 달력타입에 기본으로 양력이 보이게

	/* (non-Javadoc)
	 * @see com.starpl.platform.common.base.BaseActivity#onResume()
	 */
	@Override
	protected void onResume()
	{
		super.onResume();
		UserInfo userInfo;
		
		// 정보수정을 눌러서 온 경우에는 유저의 기본 데이터를 세팅해준다.
		if(getIntent().getBooleanExtra("isChange", false))
		{
			userInfo = (UserInfo)BaseApplication.getGlobalPersistent("userInfo");
			mBirthDay = userInfo.getBirthDate();
			DateUtil dateUtil = new DateUtil(mBirthDay);
			mLunarType = userInfo.getLunarType();
			mSexFlag = userInfo.getSexFlag(); 
			
			mEtUserName.setText(userInfo.getUserName());
			mEtUserPhone.setText(userInfo.getCellPhone());			
			mTvBirthDay.setText(dateUtil.toStringByFormat("yyyy년 M월 d일"));
			
			// 여자
			if(mSexFlag==0)
			{
				mIbMan.setSelected(false);
				mIbWoman.setSelected(true);
			}
			// 남자
			else
			{
				mIbMan.setSelected(true);
				mIbWoman.setSelected(false);
			}
			
			String lunarTypeString = "";
			
			switch(mLunarType)
			{
			// 양력
			case 0 :
				lunarTypeString = "양력";
				break;
			// 음력평달
			case 1 :
				lunarTypeString = "음력";
				break;
			// 음력윤달
			case 2 :
				lunarTypeString = "음력윤달";
				break;
			}
			
			mTvMonth.setText(lunarTypeString);
			
			String message = "닉네임/비밀번호 변경 등의 설정은 <br> PC에서 starpl.com 접속 후 이용해 주세요.";
			mTvInformation.setText(Html.fromHtml(message));
		}
		
		// 추가정보 입력을 위한 회원의 경우에 팝업 메시지 출력
		if(getIntent().getBooleanExtra("isExtra", false))
		{
			userInfo = (UserInfo)BaseApplication.getGlobalPersistent("userInfo");
			String text = "안녕하세요. " + userInfo.getNickName() + "님. " +
					"이미 스타플에 가입하셨으나 운세정보를 얻기 위해 추가 정보가 필요합니다.";
			alert(text);
			
			String message = "닉네임/비밀번호 변경 등의 설정은 <br> PC에서 starpl.com 접속 후 이용해 주세요.";
			mTvInformation.setText(Html.fromHtml(message));
		}
	}

	/**
	 * 생일을 체크합니다.
	 */
	private void checkBirthday()
	{
		MonthUnsaeCommand.checkBirthDate(new HttpHandler(this, null)
		{
			@Override
			public void didSucceed(Object result)
			{
				String name = mEtUserName.getText().toString();
				int nameLength = name.length();
				try
				{
					
					nameLength = name.getBytes("EUC-KR").length;
				}
				catch(UnsupportedEncodingException e)
				{
					e.printStackTrace();
				}
				
				String phone = mEtUserPhone.getText().toString(); 
				int phoneNumberLength = phone.length();
				
				// 이름 미입력 또는 글자수 초과에 대한 팝업 메시지를 생성한다.
				if(nameLength<4 || nameLength>10)
				{
					alert("이름을 확인하세요. 한글5자,영문16자까지 가능합니다. 특수문자는 사용할 수 없습니다.");
				}
				// 전화번호를 체크한다. 정상적이지 않다면 팝업 메시지를 생성한다.
				else if(phoneNumberLength<6 || phoneNumberLength>11)
				{
					alert("전화번호를 확인하세요. 6~11자리 숫자만 입력하세요.");
				}
				// 전화번호를 정상적으로 입력했다면 가입, 정보수정을 한다.
				else
				{
					joinStarplAndSinbiun();
				}
			}
		}, mBirthDay);
	}
	
	/**
	 * 회원가입을 합니다.
	 */
	private void joinStarplAndSinbiun()
	{
		// 회원 가입시 정보 입력
		if(!getIntent().getBooleanExtra("isChange", false) && !getIntent().getBooleanExtra("isExtra", false))
		{
			final String userId = getIntent().getStringExtra("userId");;
			final String password = getIntent().getStringExtra("password");
			final String nickName = getIntent().getStringExtra("nickName");;
			final String email = getIntent().getStringExtra("email");;
			
			MonthUnsaeCommand.join(new HttpHandler(this)
			{
				@Override
				public void didSucceed(Object result)
				{
					try
					{
						JSONObject object = ((JSONObject) result).getJSONObject("data");
						
						Log.e("JoinExtraActivity", object.toString());
						
						UserInfo userInfo = new UserInfo(object);
						BaseApplication.setGlobalPersistent("userInfo", userInfo);
						
						// 자동로그인 설정
						getSharedPreference().putSharedPreference("autoLogin", true);
						getSharedPreference().putSharedPreference("autoLoginUserId", userId);
						getSharedPreference().putSharedPreference("autoLoginUserPw", password);
						
						// 홈 엑티비티로 이동
						getNewActivity()
							.setRemoveTask()
							.setTargetActivity(HomeActivity.class)
							.show();
						
						// 가입완료 메시지를 표현
						toast(userInfo.getNickName() + "님의 가입이 완료되었습니다.");
						
						// 현재 엑티비티를 종료
						finish();
					}
					catch(JSONException e)
					{
						e.printStackTrace();
					}
				}
			}, this, userId, password, nickName, email, mEtUserName.getText().toString(), mEtUserPhone.getText().toString(), mBirthDay, mLunarType, mSexFlag);
		}
		// 정보수정
		else if ( getIntent().getBooleanExtra("isChange", false) || getIntent().getBooleanExtra("isExtra", false))
		{
			MonthUnsaeCommand.updateUserInfo(new HttpHandler(this)
			{
				@Override
				public void didSucceed(Object result)
				{
					
					try
					{
						JSONObject object = ((JSONObject) result).getJSONObject("data");
						
						UserInfo userInfo = new UserInfo(object);
						BaseApplication.setGlobalPersistent("userInfo", userInfo);
						
						if(getIntent().getBooleanExtra("isExtra", false))
						{
							// 수정완료 메시지를 표현
							toast(userInfo.getNickName() + "님의 운세정보입력이 완료되었습니다.");
							
							// 홈 엑티비티로 이동
							getNewActivity()
								.setRemoveTask()
								.setTargetActivity(HomeActivity.class)
								.show();
							
							// 현재 엑티비티를 종료
							finish();
						}
						else
						{
							// 운세정보를 다시 가져온다.
							getMonthUnsae();
							
							// 수정완료 메시지를 표현
							toast(userInfo.getNickName() + "님의 정보수정이 완료되었습니다.");
							
							// 현재 엑티비티를 종료
							finish();
						}
					}
					catch(JSONException e)
					{
						e.printStackTrace();
					}
				}
			}, this, mBirthDay, mEtUserName.getText().toString(), mEtUserPhone.getText().toString(), mLunarType, mSexFlag);
		}
	}
	
	/**
	 * 생년월일을 설정합니다.
	 */
	private void setBirthDay()
	{
		DateUtil dateUtil = new DateUtil(mBirthDay, "yyyy-MM-dd");
		final Calendar calendar = dateUtil.getCalendar();
		
		DatePickerDialog.OnDateSetListener getDateChange = new DatePickerDialog.OnDateSetListener()
		{
			@Override
			public void onDateSet(DatePicker v, int year, int monthOfYear, int dayOfMonth)
			{
				calendar.set(Calendar.YEAR, year);
				calendar.set(Calendar.MONTH, monthOfYear);
				calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
				
				//mBirthDay = year + "-" + (monthOfYear+1) + "-" + dayOfMonth;
				mBirthDay = String.format("%d-%02d-%02d", year, monthOfYear + 1, dayOfMonth);
				mTvBirthDay.setText(year + "년 " + (monthOfYear+1) + "월 " + dayOfMonth + "일");
			}
		};
		
		DatePickerDialog dialog = new DatePickerDialog
		(
				JoinExtraActivity.this, 
				getDateChange, 
				calendar.get(Calendar.YEAR), 
				calendar.get(Calendar.MONTH), 
				calendar.get(Calendar.DAY_OF_MONTH)
				
				
		);
		dialog.setTitle("생년월일을 선택하세요");
		dialog.show();
	}
	
	/**
	 * 운세정보를 가져와서 전역변수에 저장한다.
	 */
	private void getMonthUnsae()
	{
		MonthUnsaeCommand.getMonthUnsae(new HttpHandler(this, null)
		{
			@Override
			public void didSucceed(Object result)
			{
				MonthUnsae monthUnsae = new MonthUnsae((JSONObject) result);
				BaseApplication.setGlobalPersistent("monthUnsae", monthUnsae);
			}
		});
	}
	
	/* (non-Javadoc)
	 * @see android.view.View.OnClickListener#onClick(android.view.View)
	 */
	@Override
	public void onClick(View v)
	{
		switch(v.getId())
		{
		case R.id.join_extra_activity_ib_man:
			mIbMan.setSelected(true);
			mIbWoman.setSelected(false);
			mSexFlag = 1;
			break;
		case R.id.join_extra_activity_ib_woman:
			mIbMan.setSelected(false);
			mIbWoman.setSelected(true);
			mSexFlag = 0;
			break;
		case R.id.join_extra_activity_tv_birthday:
			setBirthDay();
			break;
		case R.id.join_extra_activity_tv_month:
			mTvMonth.showContextMenu();
			break;
		case R.id.join_extra_activity_ib_finish:
			// 유효한 생일인지 확인하고, 유효하면 회원가입/수정을 합니다.
			checkBirthday();
			break;
		}
	}
	
	/* (non-Javadoc)
	 * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo)
	 */
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
	{
		super.onCreateContextMenu(menu, v, menuInfo);
		menu.clearHeader();
		
		menu.add(0, SUN_ID, 0, "양력");
		menu.add(0, LUNAR_DEFAULT_ID, 0, "음력");
		menu.add(0, LUNAR_LEAP_ID, 0, "음력윤달");
	}
	
	/* (non-Javadoc)
	 * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)
	 */
	@Override
	public boolean onContextItemSelected(MenuItem item)
	{
		switch(item.getItemId())
		{
		case SUN_ID:
			mLunarType = SUN_ID;
			mTvMonth.setText("양력");
			return true;
		case LUNAR_DEFAULT_ID:
			mLunarType = LUNAR_DEFAULT_ID;
			mTvMonth.setText("음력평달");
			return true;
		case LUNAR_LEAP_ID:
			mLunarType = LUNAR_LEAP_ID;
			mTvMonth.setText("음력윤달");			
			return true;
		default :
			return super.onContextItemSelected(item);
		}
	}

	/* (non-Javadoc)
	 * @see com.starpl.platform.common.base.BaseActivity#onCreateOptionsMenu(android.view.Menu)
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		return false;
	}

	/* (non-Javadoc)
	 * @see com.starpl.platform.common.base.BaseActivity#onOptionsItemSelected(android.view.MenuItem)
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{
		return false;
	}
}
